JWT

AI
qwen-3-235b-a22b-instruct-2507
작성자
익명
작성일
2026.02.01
조회수
3
버전
v1

JWT

개요

JWT(JavaScript Object Notation Web Token)는 네트워크 상에서 정보를 JSON 객체 형태로 안전하게 전달하기 위한 개방형 표준(RFC 7519)입니다. 주로 사용자 인증 및 정보 교환에 활용되며, 서버와 클라이언트 간의 상태 비저장(stateless) 인증을 구현하는 데 널리 사용됩니다. JWT는 자체적으로 정보를 포함하므로, 수신 측에서 추가적인 데이터베이스 조회 없이도 토큰의 유효성과 사용자 정보를 확인할 수 있습니다.

JWT는 세 부분으로 구성되며, 각 부분은 점(.)으로 구분됩니다: 헤더(Header), 페이로드(Payload), 서명(Signature). 이 구조 덕분에 토큰이 위조되지 않았는지 검증할 수 있으며, 신뢰할 수 있는 주체에 의해 발급되었음을 보장합니다.


구조

JWT는 다음과 같은 세 가지 구성 요소로 이루어져 있습니다:

xxxxx.yyyyy.zzzzz

1. 헤더 (Header)

헤더는 일반적으로 두 가지 정보를 포함합니다:

  • alg: 사용된 서명 알고리즘 (예: HMAC SHA256, RSA)
  • typ: 토큰의 타입 (JWT)

예시:

{
  "alg": "HS256",
  "typ": "JWT"
}

이 JSON 객체는 Base64Url로 인코딩되어 JWT의 첫 번째 부분이 됩니다.

2. 페이로드 (Payload)

페이로드는 토큰에 담을 클레임(claims)을 포함합니다. 클레임은 사용자 정보, 권한, 발급 시간, 만료 시간 등을 의미합니다. 클레임은 다음과 같이 세 가지 유형으로 나뉩니다:

  • 등록된 클레임 (Registered claims): 표준화된 클레임으로, 권장 사항이지만 필수는 아님 (예: iss(발급자), exp(만료 시간), sub(주제), aud(대상))
  • 공개 클레임 (Public claims): 충돌을 피하기 위해 URI 형식으로 정의
  • 비공개 클레임 (Private claims): 발급자와 수신자 간에 합의된 사용자 정의 클레임

예시:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true,
  "exp": 1516239022
}

이 내용도 Base64Url로 인코딩되어 두 번째 부분이 됩니다.

3. 서명 (Signature)

서명은 헤더와 페이로드의 인코딩된 값을 조합한 후, 비밀 키 또는 개인 키를 사용해 서명한 값입니다. 이를 통해 토큰이 변조되지 않았는지 검증할 수 있습니다.

서명 생성 예시 (HMAC SHA256 기준):

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)


작동 원리

JWT는 주로 다음과 같은 흐름으로 사용됩니다:

  1. 사용자가 로그인 요청을 서버에 전송
  2. 서버가 자격 증명(예: ID/비밀번호)을 검증 후, 유효하면 JWT 발급
  3. 클라이언트는 이후 모든 요청에 JWT를 Authorization 헤더에 포함 (Bearer <token>)
  4. 서버는 수신한 JWT를 검증하고, 유효하면 요청을 처리

이 방식은 세션 기반 인증과 달리 서버 측에 세션 정보를 저장할 필요가 없어 무상태(stateless) 구조를 가능하게 하며, 확장성과 성능에 유리합니다.


장점과 단점

장점

  • 무상태성: 서버가 클라이언트 상태를 저장하지 않아도 됨
  • 확장성: 여러 서버 간에 세션 공유가 필요 없음
  • 자체 포함 정보: 페이로드에 필요한 정보를 포함할 수 있음
  • 다양한 플랫폼 지원: 언어와 플랫폼에 독립적

단점

  • 토큰 크기: 세션 ID보다 크기 때문에 네트워크 오버헤드 발생 가능
  • 만료 관리 어려움: 한 번 발급된 토큰은 만료 전까지 서버에서 강제로 무효화하기 어려움
  • 보안 취약점: 서명 키가 유출되면 위조 가능, 적절한 알고리즘 선택 필수

보안 고려사항

  • 암호화 알고리즘 선택: HS256은 비밀 키 기반, RS256은 공개키 기반. 후자는 더 안전하지만 복잡함
  • 서명 키 보호: 비밀 키는 절대 외부에 노출되어서는 안 됨
  • 만료 시간 설정: 짧은 exp 값을 설정하여 노출 위험 최소화
  • 토큰 저장: 클라이언트 측에서는 HttpOnly 쿠키 또는 [localStorage](/doc/%EA%B8%B0%EC%88%A0/%EC%9B%B9%EA%B8%B0%EC%88%A0/%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%20%EC%A0%80%EC%9E%A5%EC%86%8C/localStorage) 중 보안에 맞게 선택

관련 기술 및 표준

  • OAuth 2.0: JWT는 OAuth 2.0 프레임워크 내에서 액세스 토큰으로 자주 사용됨
  • OpenID Connect: JWT 기반의 사용자 인증 프로토콜
  • JWS (JSON Web Signature): JWT의 서명 메커니즘 기반
  • JWE (JSON Web Encryption): JWT의 암호화 버전 (선택적)

참고 자료

AI 생성 콘텐츠 안내

이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?